#ifndef LECTEURSYMBOLE_H_
#define LECTEURSYMBOLE_H_

#include <fstream>
#include <string>
using namespace std;

#include "LecteurCaractere.h"
#include "Symbole.h"

/*! \file LecteurSymbole.h
    \brief La spécification du Lecteur de symboles
   
    Décrit la liste des méthodes et attributs associés à la classe LecteurSymbole
    \author Jamet + Koelsch
    \date 19/12/2012
 */

/*! \class LecteurSymbole
    \brief La classe représentant le Lecteur de Symbole.
   
    Cette classe permet de représenter un Lecteur de Symbole.
    Un Lecteur de Symbole va parcourir le texte et décrire dans les termes
    de l'interpreteur les "mots" trouvés.
 
    Les méthodes suivantes sont associées à un objet de type Lecteur de Symbole :
    \li LecteurSymbole
    \li suivant
    \li getSymCour
    \li getLigne
    \li getColonne
    \li sauterSeparateurs
    \li sauterCommentaires
    \li motSuivant
    
    La classe contient les attributs suivants : 
    \li lc - LecteurCaractere
    \li symCour - Symbole 
    \li ligne - unsigned int
    \li colonne - unsigned int
*/
    


class LecteurSymbole {  

private:
    
/*! \brief Definition des trois attributs
*/
	LecteurCaractere lc;         // le lecteur de caracteres
	Symbole symCour;             // le symbole courant du lecteur de symboles
	unsigned int ligne, colonne; // coordonnees, dans le fichier, du symbole courant
        
        
/*! \fn sauterSeparateurs()
    \brief Saute une suite de separateurs consecutifs, jusqu'au prochain caractère valide.
*/
	void sauterSeparateurs();
        
        
/*! \fn sauterCommentaire()
    \brief À partir d'un mot clé (//), saute les tous les caractères jusqu'à '\n'
*/
        void sauterCommentaire();
        
/*! \fn motSuivant()
    \brief Lit dans lc la chaine du prochain symbole et la renvoie en resultat

    Lit les caractères jusqu'au prochain mot, lit le symbole suivant et renvoie sa chaine
*/
	string motSuivant();
        
        
public:
    
/*! \fn LecteurSymbole (string nomFich)
    \brief Constructeur de la classe LecteurSymbole
    
    Constructeur de la classe. on lui passe le nom du fichier à 
    interpreter en parametre.
    résultat : symCour = premier symbole du fichier nomFich
    \param nomFich - le nom du fichier à parcourir
*/
	LecteurSymbole(string nomFich);    // résultat : symCour = premier symbole du fichier nomFich
        
/*! \fn suivant ()
    \brief Passe au symbole suivant du fichier en utilisant sauterCommentaire/Separateurs.
*/
	void suivant();               
        
/*! \fn getSymCour ()
    \brief Accesseur à symCour
*/      
	inline Symbole getSymCour()      { return symCour; } 

/*! \fn getLigne ()
    \brief Accesseur à ligne
 
    Renvoie le numéro de la ligne où se situe le Lecteur de Symbole au moment de l'appel.
*/
	inline unsigned int getLigne()   { return ligne;   } // accesseur

/*! \fn getColonne ()
    \brief Accesseur à colonne

    Renvoie le numéro de la colonne où se situe le Lecteur de Symbole au moment de l'appel.
*/  
	inline unsigned int getColonne() { return colonne; } // accesseur



};

#endif /* LECTEURSYMBOLE_H_ */ 
